//
// Created by LONG on 2020/10/18.
//

#ifndef CSP_INCLUDE_UTILS_MEMPOOL_H_
#define CSP_INCLUDE_UTILS_MEMPOOL_H_

#include <stdint.h>
#include "commDef.h"

#ifdef __cplusplus
extern "C"
{
#endif

/******************************************************************************
 mem pool : 采用无锁方式实现的内存池。
 可用于SPSC(单生产者--单消费者)、MPSC(多生产者--单消费者)、
 SPMC(单生产者--多消费者)、MPMC(多生产者--多消费者)场景。
 ******************************************************************************/

enum
{
    MEM_POOL_TYPE_NONE = CSP_CONCURRENCY_TYPE_NONE, /* 没竞争，生产者、消费者为同一线程 */
    MEM_POOL_TYPE_SPSC = CSP_CONCURRENCY_TYPE_SPSC, /* 单生产者，单消费者 */
    MEM_POOL_TYPE_SPMC = CSP_CONCURRENCY_TYPE_SPMC, /* 单生产者，多消费者 */
    MEM_POOL_TYPE_MPSC = CSP_CONCURRENCY_TYPE_MPSC, /* 多生产者，单消费者 */
    MEM_POOL_TYPE_MPMC = CSP_CONCURRENCY_TYPE_MPMC, /* 多生产者，多消费者 */
};

typedef struct MemPool S_MemPool;

S_MemPool *MP_Create(uint32_t count, uint32_t chunkSize, uint32_t type);
void MP_Destroy(S_MemPool *self);
void* MP_Get(S_MemPool *self, uint32_t size, const char* func, uint32_t line);
int32_t MP_Put(void *chunk);
uint32_t MP_Count(S_MemPool *self);

#ifdef __cplusplus
}
#endif

#endif //CSP_INCLUDE_UTILS_MEMPOOL_H_
